<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:c="livcos.org/ns/cosmos" 
  xmlns:job="livcos.org/ns/process/job"
  exclude-result-prefixes="c job">
  
  <xsl:template match="/">
    <xsl:apply-templates select="*"/>
  </xsl:template>

  <xsl:template match="comment()">
    <div class="row">
      <span class="comment">
        <xsl:attribute name="id"><xsl:apply-templates select="." mode="id"/></xsl:attribute>
        <xsl:text>&lt;!-- </xsl:text>
        <xsl:value-of select="."/>
        <xsl:text> --&gt;</xsl:text>
      </span>
    </div>
  </xsl:template>
  
  <xsl:template match="text()">
    <div class="row">
      <span class="text">
        <xsl:attribute name="id"><xsl:apply-templates select="." mode="id"/></xsl:attribute>
        <xsl:text>&#160;</xsl:text>
        <xsl:value-of select="."/>
      </span>
    </div>
  </xsl:template>
  
  <xsl:template match="c:response/text()">
    <div class="row">
      <span class="text">
        <xsl:text>base64 binary (</xsl:text>
      	<xsl:value-of select="string-length(.)"/>
        <xsl:text> characters)</xsl:text>
      </span>
    </div>
  </xsl:template>
  
  <xsl:template match="text()[normalize-space(.) = '']">
  </xsl:template>
  
  <xsl:template match="@*">
    <xsl:text> </xsl:text>
    <span>
      <xsl:attribute name="id">
        <xsl:apply-templates select=".." mode="id"/>
        <xsl:text>.@</xsl:text>
        <xsl:value-of select="name(.)"/>
      </xsl:attribute>
      <span class="attrName"><xsl:value-of select="name(.)"/></span>
      <xsl:text>="</xsl:text>
      <xsl:apply-templates select="." mode="attr_val"/>
      <xsl:text>"</xsl:text>
    </span>
  </xsl:template>
  
  <xsl:template match="@*" mode="attr_val">
    <span class="attrVal"><xsl:value-of select="."/></span>
  </xsl:template>
  
  <xsl:template match="job:resolve/@uri" mode="attr_val">
    <a class="attrVal" href="../../..{.}"><xsl:value-of select="."/></a>
  </xsl:template>
  
  <xsl:template match="*">
    <xsl:variable name="id">
      <xsl:apply-templates select="." mode="id"/>
    </xsl:variable>
    <div>
      <xsl:attribute name="id"><xsl:value-of select="$id"/></xsl:attribute>
      <xsl:attribute name="class">
        <xsl:choose>
          <xsl:when test="../..">row</xsl:when>
          <xsl:otherwise>root</xsl:otherwise>
        </xsl:choose>
      </xsl:attribute>
    	<xsl:if test="@id">
    		<a name="{@id}"/>
    	</xsl:if>
      <xsl:text>&lt;</xsl:text>
      <xsl:choose>
        <xsl:when test="node()">
          <a class="elementName" href="javascript:Dom('_e{generate-id(.)}').toggle()">
            <xsl:value-of select="name(.)"/>
          </a>
        </xsl:when>
        <xsl:otherwise>
          <span class="elementName">
            <xsl:value-of select="name(.)"/>
          </span>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:apply-templates select="@*"/>
    	<xsl:call-template name="printNamespaceDecls">
    		<xsl:with-param name="id" select="$id"/>
    	</xsl:call-template>
    	<xsl:if test="not(node())">/</xsl:if>
      <xsl:text>&gt;</xsl:text>
      <xsl:if test="node() and ((normalize-space(.) != '') or * or comment())">
        <!--try not to create empty divs.--><div id="_e{generate-id(.)}">
          <xsl:apply-templates select="node()"/>
        </div>
      </xsl:if>
    </div>
  </xsl:template>
  
  <xsl:template match="node()" mode="id">
    <xsl:apply-templates select=".." mode="id"/>
    <xsl:text>.</xsl:text>
    <xsl:value-of select="count(preceding-sibling::node())+1"/>
  </xsl:template>
  
	<xsl:template match="/*" mode="id">
		<xsl:text>1</xsl:text>
	</xsl:template>
	
	<xsl:template name="_printNamespaceDecls">
		<xsl:param name="id"/>
		<!--
			Most browser XSLT engines don't seem to support the namespace axis :(

		<xsl:for-each select="namespace::*[local-name(.) != 'xml']">
			<xsl:variable name="prefix" select="local-name(.)"/>
			<xsl:variable name="nsUri" select="."/>
			<xsl:if test="not(ancestor::*/namespace::*[(local-name(.) = $prefix) and (. = $nsUri)])">
				<xsl:call-template name="printNS">
					<xsl:with-param name="id" select="$id"/>
					<xsl:with-param name="prefix" select="$prefix"/>
					<xsl:with-param name="nsUri" select="$nsUri"/>
				</xsl:call-template>
			</xsl:if>
		</xsl:for-each>
		<xsl:call-template name="printDefaultNS">
			<xsl:with-param name="id" select="$id"/>
		</xsl:call-template>
		-->
	</xsl:template>
	
	<xsl:template name="printNamespaceDecls">
		<xsl:param name="id"/>
		<xsl:for-each select="namespace::*[local-name(.) != 'xml']">
			<xsl:variable name="prefix" select="local-name(.)"/>
			<xsl:variable name="nsUri" select="."/>
			<xsl:if test="not(../ancestor::*/namespace::*[(local-name(.) = $prefix) and (. = $nsUri)])">
				<xsl:call-template name="printNS">
					<xsl:with-param name="id" select="$id"/>
					<xsl:with-param name="prefix" select="$prefix"/>
					<xsl:with-param name="nsUri" select="$nsUri"/>
				</xsl:call-template>
			</xsl:if>
		</xsl:for-each>
		<xsl:if test="not(namespace::*)">
			<!-- Some browsers (eg. FF 3) don't support the namespace axis.
				At least we try to output the needed namespace declarations... -->
			<xsl:if
				test="(namespace-uri(.) != namespace-uri(..)) or
				(substring-before(name(.), ':') != substring-before(name(..), ':'))">
				<xsl:call-template name="printNS">
					<xsl:with-param name="id" select="$id"/>
					<xsl:with-param name="prefix" select="substring-before(name(.), ':')"/>
					<xsl:with-param name="nsUri" select="namespace-uri(.)"/>
				</xsl:call-template>
			</xsl:if>
		</xsl:if>
	</xsl:template>
	
  <xsl:template name="printNS">
    <xsl:param name="id"/>
    <xsl:param name="prefix"/>
    <xsl:param name="nsUri"/>
    <span>
      <xsl:attribute name="id">
        <xsl:value-of select="$id"/>
        <xsl:text>.@xmlns</xsl:text>
        <xsl:if test="$prefix != ''">:</xsl:if>
        <xsl:value-of select="$prefix"/>
      </xsl:attribute>
      <xsl:text> xmlns</xsl:text>
      <xsl:if test="$prefix != ''">
        <xsl:text>:</xsl:text>
        <span class="nsPrefix">
          <xsl:value-of select="$prefix"/>
        </span>
      </xsl:if>="<xsl:if test="$nsUri != ''">
        <span class="nsUri">
          <xsl:value-of select="$nsUri"/>
        </span>
      </xsl:if>
      <xsl:text>"</xsl:text>
    </span>
  </xsl:template>
  
</xsl:stylesheet>
